package br.org.mestrado.vais.comparator;

import br.org.mestrado.vais.Anticorpo;
import br.org.mestrado.vais.util.LEGENDA;

public class ParetoMin extends ParetoCompare {

	public ParetoMin(int numObjetivos) {
		super(numObjetivos);
	}
	
	@Override
	public int compare(Anticorpo arg0, Anticorpo arg1) {

		int arg0melhor = 0, arg1melhor = numObjetivos;

		final double[] acCopy0 = modifyPareto(arg0.getObjectives());

		final double[] acCopy1 = modifyPareto(arg1.getObjectives());
		
		// Verifica se arg0 domina arg1
		// arg0 domina arg1 se e somente se
		// arg0 não for pior que arg1 em todos os
		// objetivos e for melhor em pelo menos 1 objetivo
		for (int pointer = 0; pointer < numObjetivos; pointer++) {

			// conta em quantos objetivos que arg0 é melhor que arg1
			if (acCopy0[pointer] < acCopy1[pointer]) {
				++arg0melhor;
			} else {
				if (acCopy0[pointer] == acCopy1[pointer]) {
					--arg1melhor;
				}
			}
		}

		if (arg0melhor == 0) {
			if (arg1melhor == 0)
				return LEGENDA.NAO_DOMINA.valor();
			else
				return LEGENDA.DOMINADO.valor();
		} else {
			if (arg0melhor > 0 && arg0melhor < arg1melhor)
				return LEGENDA.NAO_DOMINA.valor();
			else
				return LEGENDA.DOMINA.valor();
		}
	}

}
